অ্যাডভান্সড ডিবাগিংয়ের ভূমিকা
কার্যকরী ডিবাগিং Node.js ডেভেলপারদের জন্য একটি গুরুত্বপূর্ণ দক্ষতা।
console.log() , , .
এই টিউটোরিয়ালটি আপনার Node.js অ্যাপ্লিকেশনে চ্যালেঞ্জিং সমস্যা সমাধানে সহায়তা করার জন্য উন্নত ডিবাগিং কৌশল এবং সরঞ্জামগুলিকে কভার করে৷
উন্নত ডিবাগিং টুল নিম্নলিখিত ক্ষমতা প্রদান করে:
ব্রেকপয়েন্ট সেট করা
ধাপে ধাপে কোডিং প্রক্রিয়ার মধ্য দিয়ে যান
পরিবর্তনশীল মান পরীক্ষা করা হচ্ছে
রানটাইমে পরিবর্তনশীল মান পরীক্ষা করুন
মেমরি ব্যবহার ভিজ্যুয়ালাইজ করা
মেমরি খরচ কল্পনা করুন এবং লিক সনাক্ত করুন
CPU ব্যবহার প্রোফাইলিং
কর্মক্ষমতা বাধা সনাক্ত করতে প্রোফাইল CPU ব্যবহার
Chrome DevTools দিয়ে ডিবাগিং
Node.js Node.js Chrome DevTools Chrome DevTools .
ডিবাগ মোডে Node.js শুরু হচ্ছে
ডিবাগ মোডে আপনার অ্যাপ্লিকেশন শুরু করার বিভিন্ন উপায় রয়েছে:
স্ট্যান্ডার্ড ডিবাগিং মোড
node --inspect app.js
এটি সাধারণত আপনার আবেদন শুরু করে কিন্তু 9229 পোর্টে ইন্সপেক্টর চালায়।
স্টার্টআপে বিরতি দিন
node --inspect-brk app.js
এটি কোডের প্রথম লাইনে এক্সিকিউশনকে বিরতি দেয়, আপনাকে কার্যকর করার আগে ব্রেকপয়েন্ট সেট করতে দেয়।
কাস্টম পোর্ট
node --inspect=127.0.0.1:9222 app.js
এটি পরিদর্শকের জন্য একটি কাস্টম বোর্ড ব্যবহার করে।
ডিবাগারের সাথে সংযোগ করা হচ্ছে
পরিদর্শন পতাকা দিয়ে আপনার Node.js অ্যাপ্লিকেশন শুরু করার পরে, আপনি বিভিন্ন উপায়ে সংযোগ করতে পারেন:
Chrome DevTools:
ক্রোম খুলুন এবং chrome://inspect এ যান।
আপনি "রিমোট টার্গেট" এর অধীনে তালিকাভুক্ত আপনার Node.js অ্যাপ্লিকেশন দেখতে পাবেন।
অ্যাপ্লিকেশনের সাথে যুক্ত DevTools খুলতে "পরিদর্শন করুন" এ ক্লিক করুন:
Node.js-এর জন্য Chrome DevTools - অ্যাপ্লিকেশনের সাথে একত্রিত DevTools ইন্টারফেস
প্রযুক্তিগত নোট:
একটি ত্রুটি ঘটলে স্বয়ংক্রিয়ভাবে ভাঙতে উত্স প্যানেলের "পজ অন ক্যাচ এক্সেপশন" বৈশিষ্ট্য (বাঁকা লাইন সহ বিরতি বোতাম) ব্যবহার করুন৷
ভিএস কোডে ডিবাগিং
ভিজ্যুয়াল স্টুডিও কোড Node.js অ্যাপ্লিকেশনের জন্য দুর্দান্ত বিল্ট-ইন ডিবাগিং ক্ষমতা প্রদান করে।
VS কোডে Node.js ডিবাগিং সেট আপ করা হচ্ছে
VS কোডে আপনার Node.js অ্যাপ্লিকেশন ডিবাগ করা শুরু করার বিভিন্ন উপায় রয়েছে:
launch.json
কিভাবে VS কোড আপনার অ্যাপ্লিকেশনের সাথে লঞ্চ বা সংযোগ করা উচিত তা নির্ধারণ করতে একটি .vscode/launch.json ফাইল তৈরি করুন
স্বয়ংক্রিয় সংযোগ
যে কোনো Node.js প্রক্রিয়া স্বয়ংক্রিয়ভাবে ডিবাগ করতে VS কোড সেটিংসে স্বয়ংক্রিয় লিঙ্ক সক্ষম করুন --inspect পতাকা দিয়ে
জাভাস্ক্রিপ্ট ডিবাগিং টার্মিনাল
ভিএস কোডে জাভাস্ক্রিপ্ট ডিবাগিং টার্মিনাল ব্যবহার করুন যে কোন Node.js প্রক্রিয়াটিকে স্বয়ংক্রিয়ভাবে ডিবাগ করতে সেই টার্মিনাল থেকে চালু করুন
উদাহরণ launch.json কনফিগারেশন
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/app.js",
"skipFiles": ["<node_internals>/**"]
},
{
"type": "node",
"request": "attach",
"name": "Attach to Process",
"port": 9229
}
]
}
দ্রষ্টব্য:
যদিও VS কোড সরাসরি টাইপস্ক্রিপ্ট ফাইলগুলিকে ডিবাগ করতে পারে, উৎস মানচিত্র অনুবাদ করা জাভাস্ক্রিপ্ট কোডের পরিবর্তে মূল টাইপস্ক্রিপ্ট কোডের ডিবাগিং সক্ষম করে।
ডিবাগ মডিউল ব্যবহার করে
ডিবাগ মডিউল হল একটি লাইটওয়েট ডিবাগিং ইউটিলিটি যা আপনাকে console.log স্টেটমেন্টের সাথে আপনার কোড বিশৃঙ্খল না করে আপনার Node.js অ্যাপ্লিকেশনে শর্তসাপেক্ষ লগিং যোগ করতে দেয়।
ডিবাগ মডিউল ইনস্টল করা হচ্ছে
npm install debug
ডিবাগের মৌলিক ব্যবহার
ডিবাগ মডিউল আপনাকে নেমস্পেস ডিবাগ ফাংশন তৈরি করতে দেয় যা পরিবেশ ভেরিয়েবলের মাধ্যমে সক্রিয় বা অক্ষম করা হয়:
// আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশের জন্য নামস্থান ডিবাগার তৈরি করুন const debug = require('debug'); const debugServer = debug('app:server'); const debugDatabase = debug('app:database'); const debugAuth = debug('app:auth'); // আপনার কোডে ডিবাগার ব্যবহার করুন ডিবাগ সার্ভার ('সার্ভার %d পোর্টে শুরু হচ্ছে', 8080); debugDatabase('ডাটাবেসের সাথে সংযুক্ত: %s', 'mongodb://localhost'); debugAuth('ব্যবহারকারী %s প্রমাণীকৃত', 'john@example.com'); // ডিফল্টরূপে, এই ডিবাগ বার্তাগুলি আউটপুটে প্রদর্শিত হয় না
ডিবাগ আউটপুট সক্ষম করুন
ডিবাগ আউটপুট দেখতে, DEBUG এনভায়রনমেন্ট ভেরিয়েবলটিকে একটি কমা-বিভক্ত নেমস্পেস প্যাটার্নের তালিকায় সেট করুন:
সমস্ত ডিবাগ আউটপুট সক্ষম করুন
DEBUG=app:* node app.js
নির্দিষ্ট নামস্থান সক্রিয় করুন
DEBUG=app:server,app:auth node app.js
সমস্ত সক্রিয় করুন কিন্তু কিছু বাদ দিন
DEBUG=app:*,-app:database node app.js
সর্বোত্তম অনুশীলন:
আপনি বর্তমানে যা মেরামত করছেন তার উপর ভিত্তি করে ডিবাগ আউটপুট ফিল্টার করা সহজ করতে আপনার অ্যাপ্লিকেশনের বিভিন্ন উপাদানের জন্য নির্দিষ্ট নামস্থান ব্যবহার করুন।
মেমরি লিক সনাক্ত করা এবং ঠিক করা
Node.js .
মেমরি লিক সনাক্ত করা এবং ঠিক করা একটি গুরুত্বপূর্ণ ডিবাগিং দক্ষতা।
Node.js-এ মেমরি লিক হওয়ার সাধারণ কারণ
গ্লোবাল ভেরিয়েবল
গ্লোবাল স্কোপে সংরক্ষিত বস্তু যা কখনো পরিষ্কার করা হয় না
বন্ধ
ফাংশন যা বড় বস্তু বা ভেরিয়েবলের রেফারেন্স বজায় রাখে
ঘটনা শ্রোতা
শ্রোতাদের যোগ করা হয়েছে কিন্তু সরানো হয়নি
ক্যাশে
মেমরি ক্যাশে যে সীমা ছাড়া বৃদ্ধি
মেমরি লিক সনাক্তকরণ
মেমরি লিক সনাক্ত করতে বেশ কয়েকটি পদ্ধতি ব্যবহার করা যেতে পারে:
1. মেমরি ব্যবহার মনিটর
// মেমরি ব্যবহার মনিটর ফাংশন logMemoryUsage() { const memoryUsage = process.memoryUsage(); console.log('মেমরি ব্যবহার:'); console.log(`RSS: ${Math.round(memoryUsage.rss / 1024 / 1024)} MB`); console.log(`Heap Total: ${Math.round(memoryUsage.heapTotal / 1024 / 1024)} MB`); console.log(`Heap Used: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`); } // প্রতি 30 সেকেন্ডে লগ মেমরি ব্যবহার setInterval(logMemoryUsage, 30000);
উদাহরণ: Node.js সার্ভারে মেমরি লিক
এখানে একটি Node.js সার্ভারে একটি সাধারণ মেমরি লিক প্যাটার্ন দেখানো একটি উদাহরণ রয়েছে:
const http = প্রয়োজন('http'); // এই বস্তুটি প্রতিটি অনুরোধের জন্য ডেটা সংরক্ষণ করবে (মেমরি লিক!) const requestData = {}; const সার্ভার = http.createServer((req, res) => { // একটি অনন্য অনুরোধ আইডি তৈরি করুন const requestId = Date.now() + Math.random().toString(36).substring(2, 15); // গ্লোবাল অবজেক্টে ডেটা সঞ্চয় করুন (এটি একটি মেমরি লিক!) requestData[requestId] = { url: req.url, পদ্ধতি: req.method, হেডার: req.headers, টাইমস্ট্যাম্প: Date.now(), // লিক আরও দৃশ্যমান করতে একটি বড় বস্তু তৈরি করুন পেলোড: Buffer.alloc(1024 * 1024) // অনুরোধের জন্য 1MB বরাদ্দ করুন }; // প্রতিটি অনুরোধের পরে মেমরি ব্যবহার রেকর্ড করুন const memoryUsage = process.memoryUsage(); console.log(`অনুরোধের পরে মেমরি ব্যবহার ${requestId}:`); console.log(`- হিপ ব্যবহার করা হয়েছে: ${Math.round(memoryUsage.heapUsed / 1024 / 1024)} MB`); console.log(`- অনুরোধের সংখ্যা: ${Object.keys(requestData).length}`); res.end('রিকোয়েস্ট প্রসেসড'); }); server.listen(8080);
মেমরি লিক ঠিক করুন
উপরের উদাহরণে মেমরি লিক কীভাবে ঠিক করবেন তা এখানে:
const http = প্রয়োজন('http'); // এই বস্তুটি প্রতিটি অনুরোধের জন্য ডেটা সংরক্ষণ করবে const requestData = {}; const সার্ভার = http.createServer((req, res) => { const requestId = Date.now() + Math.random().toString(36).substring(2, 15); // গ্লোবাল অবজেক্টে ডেটা সংরক্ষণ করুন requestData[requestId] = { url: req.url, পদ্ধতি: req.method, টাইমস্ট্যাম্প: Date.now() }; // প্রতিক্রিয়া পাঠানোর পরে পরিষ্কার করুন (মেমরি লিক সমাধান) res.on('finish', () => { অনুরোধ ডেটা [অনুরোধ আইডি] মুছুন; console.log(`ক্লিন আপ রিকোয়েস্ট ${requestId}`); }); res.end('রিকোয়েস্ট প্রসেসড'); }); server.listen(8080);
গুরুত্বপূর্ণ:
ইভেন্ট শ্রোতা, টাইমার এবং ক্যাশে করা বস্তুর মতো সংস্থানগুলির জন্য সর্বদা সঠিক পরিষ্কার পদ্ধতি প্রয়োগ করুন।
ক্যাশে করা বস্তুর জন্য দুর্বল ইঙ্গিত ব্যবহার করার কথা বিবেচনা করুন বা সময়-ভিত্তিক মেয়াদ শেষ করা বাস্তবায়ন করুন।
CPU প্রোফাইলিং এবং কর্মক্ষমতা
CPU প্রোফাইলিং আপনাকে আপনার Node.js অ্যাপ্লিকেশনে পারফরম্যান্সের প্রতিবন্ধকতা সনাক্ত করতে সাহায্য করে দেখায় যে কোন অপারেশনগুলি সর্বাধিক CPU সময় ব্যয় করছে।
CPU প্রোফাইলিং পদ্ধতি
1. বিল্ট-ইন Node.js প্রোফাইলার
Node.js CPU V8 :
# CPU প্রোফাইল তৈরি করুন node --prof app.js # তৈরি করা লগ ফাইলটিকে একটি পঠনযোগ্য বিন্যাসে রূপান্তর করুন node --prof-process isolate-0xnnnnnnnnnn-v8.log > processed.txt
উদাহরণ: CPU বাধা চিহ্নিত করা
এই উদাহরণটি দেখায় কিভাবে অদক্ষ কোডিং সনাক্ত করতে হয়:
// অদক্ষ পুনরাবৃত্ত ফিবোনাচি ফাংশন ফাংশন অদক্ষ ফিবোনাচি(n) { if (n <= 1) রিটার্ন n; অদক্ষ ফিবোনাচ্চি(n - 1) + অদক্ষ ফিবোনাচ্চি(n - 2); } // একটি খুব দক্ষ পুনরাবৃত্ত ফিবোনাচি ফাংশন ফাংশন দক্ষ ফিবোনাচি(n) { if (n <= 1) রিটার্ন n; let a = 0, b = 1, temp; জন্য (আলো i = 2; i <= n; i++) { temp = a + b; a = b; b = temp; } ফেরত খ; } // কর্মক্ষমতা তুলনা করুন ফাংশন তুলনা কর্মক্ষমতা(n) { console.log(`Calculating Fibonacci(${n})`); // সময় অক্ষম সংস্করণ const inefficientStart = process.hrtime.bigint(); const inefficientResult = অদক্ষ ফিবোনাচি(n); const inefficientEnd = process.hrtime.bigint(); const inefficientTime = Number(infficientEnd - inefficientStart) / 1_000_000; // মিসে // দক্ষ সংস্করণের সময় const efficientStart = process.hrtime.bigint(); const efficientResult = efficientFibonacci(n); const efficientEnd = process.hrtime.bigint(); const efficientTime = Number(efficientEnd - efficientStart) / 1_000_000; // মিসে console.log(`অদক্ষ: ${inefficientResult} (${inefficientTime.toFixed(2)} ms)`); console.log(`দক্ষ: ${efficientResult} (${efficientTime.toFixed(2)} ms)`); console.log(`স্পীডআপ: ${Math.round(infficientTime / efficientTime)}x`); } // তুলনা চালান কর্মক্ষমতা তুলনা (30);
অ্যাসিঙ্ক্রোনাস কোড ডিবাগ করা হচ্ছে
অ্যাসিঙ্ক্রোনাস কোড এর নন-লিনিয়ার অপারেশন প্রবাহ এবং জটিল ত্রুটি প্রচারের কারণে ডিবাগ করা চ্যালেঞ্জিং হতে পারে।
Async ডিবাগিং-এ সাধারণ চ্যালেঞ্জ
ত্রুটি প্রসঙ্গ হারিয়েছে
কলব্যাকে নিক্ষিপ্ত ত্রুটিগুলি তাদের স্ট্যাক ট্রেস হারাতে পারে
কলব্যাক জাহান্নাম
অন্তর্নির্মিত কলব্যাকগুলি ফাংশন প্রবাহকে ট্রেস করা কঠিন করে তোলে
চেইন অফ প্রমিস
সঠিকভাবে পরিচালনা না করলে বাগগুলি গ্রাস করা যেতে পারে
রেসের শর্ত
সময়-নির্ভর ত্রুটি যা পুনরুত্পাদন করা কঠিন
Async ডিবাগিং কৌশল
1. ট্রাই/ক্যাচ সহ Async/Await ব্যবহার করুন
Async/await আপনাকে প্রথাগত চেষ্টা/ক্যাচ ব্লক ব্যবহার করার অনুমতি দিয়ে অ্যাসিঙ্ক্রোনাস কোড ডিবাগ করা সহজ করে তোলে:
// ডিবাগ করা কঠিন আনুন('https://api.example.com/data') তারপরে(response => response.json()) তারপর (ডেটা => প্রসেসডেটা(ডেটা)) .catch(error => console.error('Error:', error)); // ডিবাগ করা সহজ async ফাংশন fetchData() { চেষ্টা করুন { const প্রতিক্রিয়া = ওয়েট ফেচ('https://api.example.com/data'); const data = await response.json(); রিটার্ন প্রসেসডেটা(ডেটা); } ধরা (ত্রুটি) { console.error('Error:', error); নিক্ষেপ ত্রুটি; // হ্যান্ডেল করার জন্য উপরের স্তরগুলিতে ফিরে যান } }
উদাহরণ: Async কোড ডিবাগ করা
এখানে একটি উদাহরণ যা অ্যাসিঙ্ক ডিবাগিং কৌশলগুলি প্রদর্শন করে:
const util = প্রয়োজন('util'); const fs = প্রয়োজন('fs'); // প্রতিশ্রুতিতে কলব্যাক রূপান্তর করুন const readFile = util.promisify(fs.readFile); // অ্যাসিঙ্ক ফাংশনের নেস্টেড চেইন সহ ফাংশন async ফাংশন processUserData(userId) { চেষ্টা করুন { console.log(`ব্যবহারকারীর জন্য ডেটা প্রক্রিয়াকরণ ${userId}...`); // ব্যবহারকারীর ডেটা পান const userData = await fetchUserData(userId); console.log(`ব্যবহারকারীর ডেটা পুনরুদ্ধার করা হয়েছে: ${userData.name}`); // ব্যবহারকারীর পোস্ট পান const posts = ওয়েট getUserPosts(userId); console.log(`ব্যবহারকারীর জন্য ${posts.length} পোস্ট পুনরুদ্ধার করা হয়েছে`); // পোস্টগুলি প্রক্রিয়া করুন (এটি userId = 3-এর জন্য একটি ত্রুটি নিক্ষেপ করবে) const processedPosts = posts.map(post => { ফিরে আইডি: post.id, শিরোনাম: post.title.toUpperCase(), contentLength: post.content.length, // বিষয়বস্তু সংজ্ঞায়িত না হলে ব্যর্থ হয় }; }); ফেরত দিন { user: userData, posts: processedPosts }; } ধরা (ত্রুটি) { console.error('ব্যবহারকারী ডেটা প্রক্রিয়াকরণে ত্রুটি:', ত্রুটি); নিক্ষেপ ত্রুটি; } } // সিমুলেটেড API কল ফাংশন fetchUserData(userId) { ফেরত নতুন প্রতিশ্রুতি((সমাধান, প্রত্যাখ্যান) => { setTimeout(() => { যদি (userId <= 0) { প্রত্যাখ্যান (নতুন ত্রুটি('অবৈধ ব্যবহারকারী আইডি')); } অন্য { সমাধান ({ id: userId, নাম: `User ${userId}` }); } }, 500); }); } // সিমুলেটেড ডাটাবেস কোয়েরি ফাংশন getUserPosts(userId) { ফেরত নতুন প্রতিশ্রুতি((সমাধান) => { setTimeout(() => { // ত্রুটি: userId 3 এর জন্য অনির্ধারিত সামগ্রী সহ পোস্ট করুন যদি (userId === 3) { সমাধান([ {আইডি: 1, শিরোনাম: 'প্রথম পোস্ট', বিষয়বস্তু: 'সামগ্রী' }, {আইডি: 2, শিরোনাম: 'দ্বিতীয় পোস্ট', বিষয়বস্তু: অনির্ধারিত } ]); } অন্য { সমাধান([ {আইডি: 1, শিরোনাম: 'প্রথম পোস্ট', বিষয়বস্তু: 'সামগ্রী' }, {আইডি: 2, শিরোনাম: 'দ্বিতীয় পোস্ট', বিষয়বস্তু: 'আরো বিষয়বস্তু' } ]); } }, 300); }); } // আবেদন processUserData(3).catch(err => console.log('Caught at top level:', err.message));